package com.wzy.media.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wzy.media.model.po.MediaProcess;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author itcast
 */
public interface MediaProcessMapper extends BaseMapper<MediaProcess> {
    /**
     * @description 以任务（视频）序号按取模的方式分派给各个执行器处理
     * @param shardTotal  执行器总数
     * @param shardIndex  任务序号
     * @param count 任务数
     * @return
     */
    @Select("select * from media_process t where t.id % #{shardTotal} = #{shardIndex} and (t.status = '1' or t.status = '3') and t.fail_count < 3 limit #{count}")
    List<MediaProcess> selectListByShardIndex(@Param("shardTotal") int shardTotal, @Param("shardIndex") int shardIndex, @Param("count") int count);

    /**
     * 利用数据库乐观锁的原理 实现分布式锁
     * 但获取任务修改状态为处理中 则获得该锁 开启任务进行处理
     * 开启一个任务
     * @param id 任务id
     * @return 更新记录数
     */
    @Update("update media_process m set m.status='4' where (m.status='1' or m.status='3') and m.fail_count<3 and m.id=#{id}")
    int startTask(@Param("id") long id);

    /**
     * 当状态为处理中 且处理时间超过指定时间 设置为失败
     * @return
     */
    @Update("UPDATE media_process SET status = '3' WHERE status = '4'  and TIMESTAMPDIFF(MINUTE ,begin_date,NOW()) > #{maxTime}; ")
    int updateStatusExceedMaxTime(int maxTime);

}
